package modelo;

import java.util.ArrayList;

public class ERparaAF {

	private ExpressaoRegular expressao;
	private AutomatoFinito automato;
	public ArrayList<String> ers;
	public String er;

	public ERparaAF() {
		ers = new ArrayList<String>();
	}

	public AutomatoFinito getAutomatoFinito() {
		return this.automato;
	}

	public void setAutomatoFinito(AutomatoFinito af) {
		automato = af;
	}

	public ExpressaoRegular getExpressao() {
		return this.expressao;
	}

	public void setExpressao(ExpressaoRegular exp) {
		expressao = exp;
	}

	// imprimir ER e AF
	public void imprimeER() {
		String str = expressao.toString();
		System.out.println(str);
	}

	public void imprimeAF() {
		automato.printAF();
	}
	
	public AutomatoFinito ou(AutomatoFinito a1, AutomatoFinito a2){
		AutomatoFinito a = new AutomatoFinito();
		Estado q0 = new Estado();
		q0.addTransicao('e', a1.getInicial());
		q0.addTransicao('e', a2.getInicial());
		return a;
	}
	
	public AutomatoFinito concatenar(AutomatoFinito a1, AutomatoFinito a2){
		AutomatoFinito a = new AutomatoFinito();
		a1.clone(a);
		ArrayList<Estado> finais = a.getEstados();
		for(Estado e : finais)
			if(e.getFinal()){
				e.addTransicao('e', a2.getInicial());
				e.setFinal(false);
			}
		a2.getInicial().setInicial(false);
		for(Estado e: a2.getEstados()){
			a.addEstado(e);
		}
		return a;
	}
	
	public AutomatoFinito fechamento(AutomatoFinito a1){
		ArrayList<Estado> finais = a1.getEstados();
		for(Estado e : finais)
			if(e.getFinal())
				e.addTransicao('e', a1.getInicial());
		return a1;
	}	
	
	public int thompson(String er) {
		String aux = er;
		int i = 0;
		while(aux.indexOf('(') != -1){
			int k = aux.substring(i).indexOf('(');
			int f = aux.substring(i).indexOf(')');
			if(er.indexOf(')') > er.indexOf('(') && aux.substring(i).indexOf('(') < aux.substring(i).indexOf(')')){
				i = er.indexOf('(');
				i += thompson(er.substring(i+1)) + 1;
			}
			else{
				int j = er.indexOf(')');
				aux = er.substring(0, er.substring(i).indexOf(')')+i);
				ers.add(aux);
				return j+1;
			}
		}
		/*
		int ponteiro = er.indexOf(')');
		String s = er.substring(0, ponteiro);
		ers.add(s);
		*/
		return 1;
	}
}

/*
public int thompson(String er, String aux, int i, int j) {
	while (aux.charAt(0) == '(') {
		i = thompson(er, aux.substring(1), i+1, j+i);
		aux = er.substring(i);
		if (aux.isEmpty()) {
			ers.add(er);
			return i;
		}
	}
	if(aux.charAt(0) == ')'){
		String er2 = er.substring(j, i+1);
		ers.add(er2);
		return i+1;
	}
	int k = aux.indexOf(")");
	String er1 = aux.substring(0, k);
	ers.add(er1);
	return k+i+1;
}
}*/


